import fs from 'fs';
import path from 'path';
import archiver from 'archiver';

/**
 * 压缩目录内容到 zip 文件
 * @param {string} sourceDir - 源目录路径
 * @param {string} outZipPath - 输出 zip 文件路径（含文件名）
 * @param {object} options
 * @param {boolean} options.includeRoot - 是否包含根目录在 zip 内
 * @param {string[]} options.ignore - 忽略文件/目录
 * @returns {Promise<string>} - 返回生成的 zip 文件路径
 */
export function zipDirectory(sourceDir, outZipPath, options = {}) {
  const { includeRoot = false, ignore = [] } = options;

  return new Promise((resolve, reject) => {
    try {
      // 确保输出目录存在
      const outDir = path.dirname(outZipPath);
      if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });

      const output = fs.createWriteStream(outZipPath);
      const archive = archiver('zip', { zlib: { level: 9 } });

      // 监听完成事件
      output.on('close', () => {
        resolve(outZipPath);
      });

      output.on('error', (err) => reject(err));
      archive.on('error', (err) => reject(err));

      archive.pipe(output);

      // 这里保证目录内容被正确压缩
      archive.directory(sourceDir, includeRoot ? path.basename(sourceDir) : false, { ignore });

      // finalize 返回 Promise，确保数据全部写入
      archive.finalize().catch(reject);
    } catch (err) {
      reject(err);
    }
  });
}
